/*
如图解法：以示例 1 为例，可以从中得数据的为 0 的横纵坐标为 (1, 1)，横纵分别存储后可以得到如图所示，使用或运算将对应位置的数字更改为 0 即可

        false   true    false

false   false   true    false

true    true    true    true

false   false   true    false

73. 矩阵置零

给定一个 m x n 的矩阵，如果一个元素为 0 ，则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。


示例 1：


输入：matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出：[[1,0,1],[0,0,0],[1,0,1]]
示例 2：


输入：matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出：[[0,0,0,0],[0,4,5,0],[0,3,1,0]]
 

提示：

m == matrix.length
n == matrix[0].length
1 <= m, n <= 200
-231 <= matrix[i][j] <= 231 - 1
 

进阶：

一个直观的解决方案是使用  O(mn) 的额外空间，但这并不是一个好的解决方案。
一个简单的改进方案是使用 O(m + n) 的额外空间，但这仍然不是最好的解决方案。
你能想出一个仅使用常量空间的解决方案吗？
*/

class Solution {
    public void setZeroes(int[][] matrix) {
        boolean[] col = new boolean[matrix.length];
        boolean[] row = new boolean[matrix[0].length];

        for (int i = 0; i < matrix.length; i++) {
            int[] tem = matrix[i];
            for (int j = 0; j < tem.length; j++) {
                if (tem[j] == 0) {
                    col[i] = true;
                    row[j] = true;
                }
            }
        }

        for (int i = 0; i < col.length; i++) {
            for (int j = 0; j < row.length; j++) {
                if (row[j] || col[i]){
                    matrix[i][j] = 0;
                }
            }
        }
    }
}